package io.netty.example.myTest.chat;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
 * 服务器端的业务处理类
 * 自定义一个 Handler，需要继承 Netty 规定好的某个 HandlerAdapter（规范）
 * InboundHandler 用于处理数据流入本端（服务端）的 IO 事件
 * OutboundHandler 用于处理数据流出本端（服务端）的 IO 事件
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当通道有数据可读时执行
     *
     * @param ctx 上下文对象，可以从中取得相关联的 Pipeline、Channel、客户端地址等
     * @param msg 客户端发送的数据
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx,Object msg){
        System.out.println("Server:"+ctx);
        // ByteBuf 是 Netty 提供的类，比 NIO 的 ByteBuffer 性能更高
        ByteBuf buf = (ByteBuf) msg;
        System.out.println("客户端发来的消息：" + buf.toString(CharsetUtil.UTF_8));
    }

    /**
     * 数据读取完毕后执行
     *
     * @param ctx 上下文对象
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx){
        // 发送响应给客户端
        // Unpooled 类是 Netty 提供的专门操作缓冲区的工具类
        // copiedBuffer 方法返回的 ByteBuf 对象类似于NIO 中的 ByteBuffer，但性能更高
        ByteBuf byteBuf = Unpooled.copiedBuffer("hello client(>^ω^<)喵", CharsetUtil.UTF_8);
        ctx.writeAndFlush(byteBuf);
    }

    /**
     * 发生异常时执行
     *
     * @param ctx   上下文对象
     * @param t 异常对象
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,Throwable t){
        // 关闭与客户端的 Socket 连接
        ctx.close();
    }


}
